﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Security;
using Siser.Web.Shared;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace Siser.Web.Controllers
{ 
    public class UsuarioPendienteController : Controller
    {
        private SiserEntities db = new SiserEntities();

        public ActionResult Index()
        {
            var usuariospendientes = db.UsuariosPendientes.Include(up => up.Empresa).Include(up => up.Usuario.Empleado).Where(up => up.Activo == false);
            return View(usuariospendientes.ToList());
        }

        public ActionResult Activar(int id)
        {
            ViewBag.RolId = new SelectList(db.Roles, "Id", "Nombre");
            
            UsuarioPendiente usuarioPendiente = db.UsuariosPendientes.Find(id);
            return View(usuarioPendiente);
        }

        [HttpPost]
        public ActionResult Activar(UsuarioPendiente model)
        {
            UsuarioPendiente usuarioPendiente = db.UsuariosPendientes.Find(model.Id);
            usuarioPendiente.Usuario.ContrasenaComparada = usuarioPendiente.Usuario.Contrasena;

            if (model.Usuario.RolId != 15)
            {
                usuarioPendiente.Activo = true;
                usuarioPendiente.Usuario.RolId = model.Usuario.RolId;
                usuarioPendiente.Usuario.Vigencia = true; 
                db.Entry(usuarioPendiente.Usuario).State = EntityState.Modified;
                db.SaveChanges();


                Mail.Send("siser.noreply@cchen.cl", usuarioPendiente.Usuario.Empleado.CorreoElectronico, 
                         "Tarjeta Identificación. CORREO SISER - NO RESPONDA", "Estimado " + usuarioPendiente.Usuario.Empleado.Nombre +
                         " se adjunta su tarjeta de identificación", true, CredencialIngresoPDF.GetPDFStream(usuarioPendiente.UsuarioId));
                db.UsuariosPendientes.Remove(usuarioPendiente);
                db.SaveChanges();
                
                //Asignamos un set de equipos en función del rol del usuario que se esta dando el alta
                //se asignan equipos siempre y cuando no se posea el perfil de administrador
                
                //RolId = 1 Administrador
                //RolId = 10 Equipos Monitoreo fijo
                //RolId = 11 Equipos Monitoreo ambiental
                //RolId = 12 Total
                //RolId = 13 Protección Física
                int idSistema = 0;

                switch (model.Usuario.RolId)
                {
                    case 1: //Admin
                        idSistema = 0;
                         break;
                    case 10: //Monitoreo Fijo
                        idSistema = 1;
                        break;
                    case 11: //Monitoreo ambiental
                        idSistema = 2;
                        break;
                    case 12: //Total
                        idSistema = 0;
                        break;
                    case 13: //Protección fisica
                        idSistema = 3;
                        break;
                    default:
                        idSistema = 0;
                        break;
                }

                List<Equipo> equipos;
                
                //Todos los equipos (Administracion y Total)
                if (idSistema == 0)
                {
                    equipos = (
                                  from e in db.Equipos
                                  join s in db.Sistemas on e.SistemaId equals s.Id
                                  select e
                                 ).ToList();
                }
                //Tanto en monitoreo fijo y movil se anexan ademas las proteccion fija y movil ya que se realizo una distincion
                //por temas de consultas a la bd.

                //Monitoreo fijo
                else if (idSistema == 1)
                {
                    equipos = (from e in db.Equipos
                              join s in db.Sistemas on e.SistemaId equals s.Id
                              where s.Id == idSistema || s.Id == 6 //6 idSistema para Protección fija
                              select e).ToList();
                }
                //Monitoreo ambiental
                else if (idSistema == 2)
                {
                    equipos = (from e in db.Equipos
                               join s in db.Sistemas on e.SistemaId equals s.Id
                               where s.Id == idSistema || s.Id == 7 //7 idSistema para Protección ambiental
                               select e).ToList();
                }
                //Proteccion fisica 
                else
                {
                    equipos = (from e in db.Equipos
                               join s in db.Sistemas on e.SistemaId equals s.Id
                               where s.Id == 6 || s.Id == 7 //7 idSistema para Protección ambiental
                               select e).ToList();
                } 

                foreach(var equipo in equipos)
                {
                    UsuarioEquipo ue = new UsuarioEquipo();
                    ue.EquipoId = equipo.Id;
                    ue.UsuarioId = usuarioPendiente.UsuarioId;
                    
                    db.UsuariosEquipos.Add(ue);

                    db.SaveChanges();
                }

                return RedirectToAction("Index");
            }

            ViewBag.RolId = new SelectList(db.Roles, "Id", "Nombre", model.Usuario.RolId);         
            return View(usuarioPendiente);
        }

        public ActionResult Delete(int id)
        {
            UsuarioPendiente usuarioPendiente = db.UsuariosPendientes.Find(id);
            return View(usuarioPendiente);
        }

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            UsuarioPendiente usuarioPendiente = db.UsuariosPendientes.Find(id);

            var coordenadas = (from c in db.Coordenadas
                               join t in db.TarjetasIdentificaciones on c.TarjetaIdentificacionId equals t.Id
                               join u in db.Usuarios on t.UsuarioId equals u.Id
                               join e in db.UsuariosPendientes on u.Id equals e.UsuarioId
                               where e.Id == id
                               select c.Id).ToList();
            foreach (var del in coordenadas)
            {
                Coordenada coordenada = db.Coordenadas.Find(del);
                db.Coordenadas.Remove(coordenada);
                db.SaveChanges();
            }

            var tarjetas = (from t in db.TarjetasIdentificaciones
                            join u in db.Usuarios on t.UsuarioId equals u.Id
                            join e in db.UsuariosPendientes on u.Id equals e.UsuarioId
                            where e.Id == id
                            select t.Id).ToList();
            foreach (var del2 in tarjetas)
            {
                TarjetaIdentificacion Tarjeta = db.TarjetasIdentificaciones.Find(del2);
                db.TarjetasIdentificaciones.Remove(Tarjeta);
                db.SaveChanges();
            }
            db.Empleados.Remove(usuarioPendiente.Usuario.Empleado);
            db.Usuarios.Remove(usuarioPendiente.Usuario);
            db.UsuariosPendientes.Remove(usuarioPendiente);            
            db.SaveChanges();
            return RedirectToAction("Index");
        }

       

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}